package com.itheima.service.db.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.domain.PmsProductAttribute;
import com.itheima.domain.PmsProductAttributeCategory;
import com.itheima.domain.PmsProductCategory;
import com.itheima.mapper.PmsProductAttributeCategoryMapper;
import com.itheima.mapper.PmsProductAttributeMapper;
import com.itheima.service.db.PmsProductAttributeCategoryService;
import com.itheima.vo.PageBeanVo;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@DubboService
public class PmsProductAttributeCategoryServiceImpl implements PmsProductAttributeCategoryService {

    @Autowired
    PmsProductAttributeCategoryMapper pmsProductAttributeCategoryMapper;

    @Autowired
    PmsProductAttributeMapper pmsProductAttributeMapper;

    /**
     * 添加商品属性分类
     *
     * @param name
     * @return
     */
    @Override
    public Boolean addProductAttributeCategory(String name) {
        //1.判断该是属性名称是否存在
        LambdaQueryWrapper<PmsProductAttributeCategory> qw = new LambdaQueryWrapper<>();
        qw.eq(PmsProductAttributeCategory::getName, name);
        Integer count = pmsProductAttributeCategoryMapper.selectCount(qw);
        if (count > 0) {
            //2.表示存在该属性分类名称
            return false;
        } else {
            //3.添加属性分类到数据库
            PmsProductAttributeCategory ppac = new PmsProductAttributeCategory();
            ppac.setName(name);
            pmsProductAttributeCategoryMapper.insert(ppac);
            return true;
        }
    }

    /**
     * 删除单个商品属性分类
     *
     * @param id
     */
    @Override
    public void deleteOne(Long id) {
        //首先查询属性表,查看该分类下有没有属性
        LambdaQueryWrapper<PmsProductAttribute> qw = new LambdaQueryWrapper<>();
        qw.eq(PmsProductAttribute::getProductAttributeCategoryId, id);
        List<PmsProductAttribute> pmsProductAttributes = pmsProductAttributeMapper.selectList(qw);
        if (CollUtil.isNotEmpty(pmsProductAttributes)) {
            //2.如果不为空,则表示有分类属性值,需要级联删除属性
            for (PmsProductAttribute pmsProductAttribute : pmsProductAttributes) {
                Long attributeId = pmsProductAttribute.getId();
                //3.先根据属性id删除属性
                pmsProductAttributeMapper.deleteById(attributeId);
            }
        }
        //4.最后再删除属性分类信息
        pmsProductAttributeCategoryMapper.deleteById(id);
    }

    /**
     * 分页获取所有商品属性分类
     *
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public PageBeanVo findByPage(Integer pageNum, Integer pageSize) {
        //1.创建分页查询器
        Page<PmsProductAttributeCategory> page = new Page<>(pageNum, pageSize);
        //2.创建条件构造器
        LambdaQueryWrapper<PmsProductAttributeCategory> qw = new LambdaQueryWrapper<>();
        //3.查询数据库
        pmsProductAttributeCategoryMapper.selectPage(page, qw);
        //4.封装返回数据
        return new PageBeanVo(pageNum, pageSize, page.getTotal(), page.getRecords());
    }

    /**
     * 获取所有商品属性分类
     *
     * @return
     */
    @Override
    public List<PmsProductAttributeCategory> findWithAttr() {
        LambdaQueryWrapper<PmsProductAttributeCategory> qw = new LambdaQueryWrapper<>();
        return pmsProductAttributeCategoryMapper.selectList(qw);
    }


    /**
     * 修改商品属性分类
     *
     * @param id
     * @param name
     * @return
     */

    @Override
    public Boolean updateCategory(Long id, String name) {
        PmsProductAttributeCategory pmsProductAttributeCategory = new PmsProductAttributeCategory();
        pmsProductAttributeCategory.setId(id);
        pmsProductAttributeCategory.setName(name);
        //1.判断该是属性名称是否存在
        LambdaQueryWrapper<PmsProductAttributeCategory> qw = new LambdaQueryWrapper<>();
        qw.eq(PmsProductAttributeCategory::getName, name);
        List<PmsProductAttributeCategory> categoryList = pmsProductAttributeCategoryMapper.selectList(qw);
        if (CollUtil.isNotEmpty(categoryList)) {
            //2.表示存在该属性分类名称
            for (PmsProductAttributeCategory category : categoryList) {
                if (category.getId() == id) {
                    //表示是本品牌,可以更新数据
                    pmsProductAttributeCategoryMapper.updateById(pmsProductAttributeCategory);
                    return true;
                } else {
                    //表示重名
                    return false;
                }
            }
        }
        //3.表示没有该分类名称,修改属性分类到数据库
        pmsProductAttributeCategoryMapper.updateById(pmsProductAttributeCategory);
        return true;
    }


    /**
     * 根据id查询分类信息
     *
     * @param id
     * @return
     */
    @Override
    public PmsProductAttributeCategory getOneById(Long id) {
        return pmsProductAttributeCategoryMapper.selectById(id);
    }
}
